from django.shortcuts import render

from rest_framework.views import APIView
from rest_framework.response import Response
from django.core.paginator import Paginator
from django.db.models import Max,Q,F,Min,Avg,Count,Sum
from django.contrib.auth.hashers import make_password,check_password
import datetime # 导入时间包
import time
import random
from utils.comm import send_message
from utils.comm import get_redis_conn
from .ser import *
from django.http import HttpResponse
from meiduo01.models import *

# Create your views here.

# 读取首页三级分类
class Home(APIView):
    def get(self,request):
        # 读取一级             filter过滤的意思 parent_id_isnull=True是为空的意思 在数据库中查询可以看到parent_id为空的化就是一级
        cates=Category.objects.filter(parent_id__isnull=True).all()
        print(cates)
        # 定义一个空列表
        list=[]
        # 循环
        for i in cates:
            # 定义一个空字典
            dict={}
            # 以键值对的形式添加信息
            dict['id']=i.id
            dict['name']=i.name
            # 读取二级 反向查询获取一级下的二级  subs是模型层中定义的反查询
            # cates = Category.objects.filter(parent_id=id).all()
            two=i.subs.all()
            # print(two)
            twolist=[]
            # 遍历二级获取三级
            for j in two:
                # 定义空字典
                twodict={}
                # 以键值对的形式添加
                twodict['id']=j.id
                twodict['name']=j.name
                # 反查询
                three=j.subs.all()
                # 调用序列化器
                ser=CateSer(three,many=True)
                # 字典的添加
                twodict['subs']=ser.data
                # 把字典添加到列表twolist中
                twolist.append(twodict)

            dict['subs']=twolist
            list.append(dict)
        # 查询一级分类，一级下面的二级，一级下面的三级，一级下面所有的商品
        categoods=[]
        for j in cates:
            dict={}
            dict['id']=j.id
            dict['name']=j.name
            dict['pic']=str(j.pic)
            two=j.subs.all()
            twoser=CateSer(two,many=True)
            dict['two']=twoser.data
            # 获取三级
            three=Category.objects.filter(top_parent=j.id,level=3).all()
            threeser=CateSer(three,many=True)
            dict['three']=threeser.data
            # 获取商品，排序，新品按时间倒序排，价格，销量
            sorted=request.GET.get('sorted')
            topid=request.GET.get('topid')
            goods=Goods.objects.filter(category1_id=j.id,home_show=1).all()
            if sorted:
                if int(topid)==int(j.id):
                    goods=Goods.objects.filter(category1_id=j.id,home_show=1).order_by('-'+sorted).all()
            gser=GoodsSer(goods,many=True)
            dict['goods']=gser.data
            categoods.append(dict)


        return Response({'code':200,'catelist':list,'categoods':categoods})

class GoodsM(APIView):
    def get(self,request):
        # 获取id
        id=request.GET.get('id')
        # 通过id过滤商品表信息
        good=Goods.objects.filter(id=id).first()
        ser=GoodsSer(good)
        return Response({'code':200,'good':ser.data})

class CartM(APIView):
    def post(self,request):
        # 判断此用户是否购买过此商品
        userid=request.data.get('user')
        goodsid=request.data.get('goods')
        number=int(request.data.get('number'))
        # 通过userid和goodsid过滤购物车表信息
        cart=Cart.objects.filter(user_id=userid,goods_id=goodsid).first()
        # 如果cart存在
        if cart:
            # 如果买过数量+
            cart.number+=number
            cart.save()
            return Response({'code':200})
        else:
        # 没买过购物车新增一条记录
            ser=CartSer(data=request.data)
            if ser.is_valid():
                ser.save()
                return Response({'code':200})
            else:
                print(ser.errors)
                return Response({'code':10010})

    def get(self,request):
        # 先获取userid
        userid=request.GET.get('userid')
        # 通过userid过滤购物车表信息
        cart=Cart.objects.filter(user_id=userid).all()
        # 调用序列化器 showcareser这个序列化器是一个嵌套序列化器 他把购物车表和商品表套一起了
        ser=ShowCartSer(cart,many=True)
        # 全选
        selected_all=True #先定义一个变量状态为True
        total=0   # 定义一个变量total 初始值为0
        select_total=0 # 定义一个变量select_total 初始值为0
        select_money=0 # 定义一个变量select_money 初始值为0
        # 循环购物车表信息
        for i in cart:
            total+=i.number
            if i.is_checked==False:
                selected_all=False
            else:
                select_total+=i.number
                goods=Goods.objects.filter(id=i.goods_id).first()
                select_money+=i.number*float(goods.price)
        return Response({'code':200,'list':ser.data,'selected_all':selected_all,'total':total,'select_total':select_total,'select_money':select_money})

    def put(self,request):
        # 获取id
        id=request.GET.get('id')
        # 通过id过滤购物车表信息
        cart=Cart.objects.filter(id=id).first()
        if cart.is_checked==True:
            cart.is_checked=False
        else:
            cart.is_checked=True
        cart.save()
        return Response({'code':200})

# 全选
class SelectAll(APIView):
    def put(self,request):
        # 先获取userid
        userid=request.GET.get('userid')
        # 获取全部信息
        selected_all=request.GET.get('selected_all')
        if selected_all == 'true':
            Cart.objects.filter(user_id=userid).update(is_checked=True)
        else:
            Cart.objects.filter(user_id=userid).update(is_checked=False)
        return Response({'code':200})

    def post(self,request):
        id=request.data.get('id')
        type=request.data.get('type')
        count=request.data.get('count')
        cart=Cart.objects.filter(id=id).first()
        if type==1:
            # 加
            cart.number+=1
        elif type==2:
            #减
            #判断是否>1
            if cart.number>1:
                cart.number-=1
        else:
            # 数量更新
            cart.number=int(count)
        cart.save()
        return Response({'code':200})

class GetCheckedCart(APIView):
    def get(self,request):
        #获取userid
        userid=request.GET.get('userid')
        #通过userid,is_checked=true查询 购物车表信息
        cart=Cart.objects.filter(user_id=userid,is_checked=True).all()
        # 调用序列化器
        ser=ShowCartSer(cart,many=True)
        total=0
        tmoney=0
        # 循环
        for i in ser.data:
            #查询总数量
            total+=i['number']
            # 查询总金额
            tmoney+=i['number']*float(i['goods']['price'])
        # 返回
        return Response({'code':200,'list':ser.data,'total':total,'tmoney':tmoney})


import datetime
import random
from django.db import transaction

# 生成订单接口
class CreateOrders(APIView):
    @transaction.atomic
    def post(self,request):
        #获取userid
        userid=request.data.get('userid')
        address_id=request.data.get('address_id')
        pay_method=request.data.get('pay_method')
        #根据userid查询购物车中已经选中的记录
        cart=Cart.objects.filter(user_id=userid,is_checked=True).all()
        cartser=ShowCartSer(cart,many=True)
        #遍历购物车
        total_amount=0
        for i in cartser.data:
            total_amount+=i['number']*float(i['goods']['price'])
        #生成订单号
        order_no=datetime.datetime.strftime(datetime.datetime.now(),'%Y%m%d%H%m%s')+str(userid)+str(random.randint(1000,9999))
        #查找地址构造地址信息
        add=Address.objects.filter(id=address_id).first()
        addressSer=ShowAddressSer(add)
